package jmine.tec.script;

/**
 * Contrato que um executor de scripts deve respeitar.
 * 
 * @author jrenaut
 */
public interface ScriptExecutor {

    /**
     * Executa o Script definido no contexto.
     * 
     * @param <R> O tipo do Resultado
     * @param context O contexto de execução
     * @return R
     * @throws ScriptExecutorException Se não for possível executar o Script
     */
    <R> R execute(ScriptExecutionContext<R> context) throws ScriptExecutorException;

    /**
     * Descreve as dependências do script definido no contexto.
     * 
     * @param <R> O tipo do Resultado
     * @param context O contexto de execução
     * @return R
     * @throws ScriptExecutorException Se não for possível executar o Script
     */
    <R> R getDependencies(ScriptExecutionContext<R> context) throws ScriptExecutorException;

    /**
     * Executa a validação por script
     * 
     * @param <R> O tipo do Resultado
     * @param context O contexto de execução
     * @return R
     * @throws ScriptExecutorException Se não for possível executar o Script
     */
    <R> R getValidations(ScriptExecutionContext<R> context) throws ScriptExecutorException;
}
